import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 夜半梦中微凉
 */
public class BiantukuSpider implements PageProcessor {

    private final static Logger logger = LoggerFactory.getLogger(BiantukuSpider.class);

    /**
     * 设置参数
     */
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(1000);
    private static List<String> imagePageUrls = new ArrayList<String>();

    /**
     * 主方法启动爬虫
     */
    public static void main(String[] args) {

        logger.info("start to get photo page url");

        // 这里只爬取第一页的壁纸，如果要爬取其他页数修改for循环参数即可
        for (int i = 1; i <= 1; i++) {
            String url;
            if(i == 1){
                url = "https://pic.netbian.com/4kdongman/";
            }else {
                url = String.format("https://pic.netbian.com/4kdongman/index_%s.html",String.valueOf(i));
            }
            // 启动爬虫
            Spider.create(new BiantukuSpider())
                    // 添加初始化的URL
                    .addUrl(url)
                    // 使用单线程
                    .thread(5)
                    // 运行
                    .run();
        }
    }

    /**
     * 页面处理逻辑
     * 也就是访问主程序中的URL后得到的页面
     *
     * 爬虫思路：
     *      1. 主程序访问URL后得到页面
     *      2. 将得到的页面解析出需要的参数，并将解析出来并且需要爬取的链接放入爬取目标中 （45-59行）
     *          TIPS：WebMagic会自动去识别哪些连接爬取过哪些没有。
     *      3. 访问第二步中放入的链接得到页面，并解析（62行）
     *      4. 将图片的名字和后缀提取出来以便保存（64-77行）
     */
    @Override
    public void process(Page page) {
        // 一页是20张图片
        for (int i = 1; i <= 20; i++) {

            // 使用Xpath解析，获取到单个图片的网页
            // WebMagic支持使用Xpath、CSS选择器、正则表达式、JsonPath来解析页面
            String str = page.getHtml().xpath("//ul[@class='clearfix']/li[" + i + "]/a/@href").toString();

            // 获取到的连接为null则退出循环，不添加进爬取目标
            if (str == null || str.trim().length() == 0) {
                break;
            }

            logger.info("photo page url is : {}", str);

            // 将爬取到的链接添加到待爬取页面中
//            page.addTargetRequest(str);
            imagePageUrls.add(str);

        }

        //访问待爬取的url并下载图片
        DownloadPhoto.downloadPhotoFromUrl(imagePageUrls);

    }

    @Override
    public Site getSite() {
        return site;
    }
}